package com.ksyun.campus.metaserver.domain.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import jakarta.validation.constraints.NotBlank;

/**
 * Delete request
 */
/**
 * DeleteRequest 类
 * ----------------------------------------
 * 作用：
 *   用于封装客户端发起的删除文件或目录请求的参数。
 *   一般会在 API 接口（例如 delete API）中作为请求体使用。
 *
 * 典型场景：
 *   1. 删除单个文件
 *   2. 删除目录（可选择是否递归删除子目录和文件）
 *
 * 与 minFS 的关系：
 *   - 这个类属于元数据操作请求的一部分（metaServer 接收并解析它）
 *   - path 和 recursive 信息会传给 metaServer，决定删除范围
 */
@Data                   // Lombok 注解：自动生成 getter、setter、toString、equals、hashCode 方法
@Builder                // Lombok 注解：为该类生成 Builder 模式构造器，方便链式创建对象
@NoArgsConstructor      // Lombok 注解：生成无参构造方法
@AllArgsConstructor     // Lombok 注解：生成全参构造方法
public class DeleteRequest {

    @NotBlank(message = "Path cannot be blank") // Jakarta Bean Validation 注解：校验 path 不为空
    private String path;
    /**
     * 是否递归删除
     * ----------------------------------------
     * 默认值：false（非递归）
     * 说明：
     *   - 当 path 是目录时：
     *       - recursive = false → 目录必须为空才能删除，否则会报错
     *       - recursive = true  → 会删除目录以及目录下的所有文件和子目录
     *   - 当 path 是文件时，该参数无实际作用（直接删除）
     *
     * @Builder.Default：
     *   - 保证使用 Builder 模式时，如果不手动设置 recursive，则默认值是 false
     *   - 否则 Lombok Builder 会把它当成默认 boolean 值（false），但无法区分是“没设置”还是“显式设置 false”
     */
    @Builder.Default
    private boolean recursive = false;
}
